import matplotlib.pyplot as plt
import numpy as np
import warnings
from config import SAVE_IMAGE

# 忽略字体警告
warnings.filterwarnings("ignore", category=UserWarning, module="matplotlib")
# 设置中文字体
plt.rcParams['font.family'] = 'SimHei'
# 解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False


def ancient_plot_visualization_data(sorted_data, display_image):
    # 获取画板
    figure = plt.figure(figsize=(12, 8))  # 增大画布尺寸，避免标注拥挤

    # 生成颜色（按子列表分组，每组一个颜色）
    num_groups = len(sorted_data)
    # 从tab20色板中取色
    colors = plt.cm.tab20(np.linspace(0, 1, num_groups))

    # 绘制图例、边框矩形与word
    for idx, data in enumerate(sorted_data):
        # 用于会图例的参数
        x_center_max = 0
        y_center_max = 0
        # 用于获取一个矩形的大小，让图例位置为一个图例大小
        sum_h = 0
        number = 0

        for item in data:
            coordinates_str = item['word_coordinates']
            word = item['word']
            x, y, w, h = map(int, coordinates_str.split(','))

            x_center_max = max(x_center_max, x + w / 2)
            y_center_max = max(y_center_max, y + h / 2)
            sum_h += h
            number += 1

            # 左上角 → 右上角 → 右下角 → 左下角 → 回到左上角（闭合）
            rect_x = [x, x + w, x + w, x, x]
            rect_y = [y, y, y + h, y + h, y]

            # 绘制边框矩形
            plt.plot(rect_x, rect_y, color=colors[idx], alpha=0.8, linewidth=2)

            # 绘制文字
            word = word.replace("$", "\\$")
            plt.text(x + w / 2, y + h / 2, word, usetex=False, fontsize=8, bbox=dict(
                facecolor='white', edgecolor=colors[idx]
            ))

        # 绘制列名图例
        average_h = sum_h / number
        legend_name = f'列{idx + 1}'
        plt.text(x_center_max, y_center_max + average_h, legend_name, fontsize=8,
                 ha='center', va='center', bbox=dict(
                facecolor='white', edgecolor=colors[idx]
            ))

    # 设置图表样式
    plt.title('文字坐标可视化（按组区分）', fontsize=16, pad=20)
    plt.xlabel('X坐标（越大越靠右）', fontsize=12, labelpad=10)
    plt.ylabel('Y坐标（越大越靠上）', fontsize=12, labelpad=10)
    plt.grid(linestyle='--', alpha=0.3, color='gray')  # 浅灰色网格

    try:
        plt.tight_layout()
    except Exception as e:
        print(f"tight_layout 错误: {e}")

    if SAVE_IMAGE:
        return figure

    if display_image:
        # 显示图表
        plt.show()
        # 关闭画板
        plt.close()

    return None


def modern_plot_visualization_data(sorted_data, display_image):
    # 获取画板
    figure = plt.figure(figsize=(12, 8))  # 增大画布尺寸，避免标注拥挤

    # 生成颜色（按子列表分组，每组一个颜色）
    num_groups = len(sorted_data)
    # 从tab20色板中取色
    colors = plt.cm.tab20(np.linspace(0, 1, num_groups))

    # 绘制图例、边框矩形与word
    for idx, data in enumerate(sorted_data):
        # 用于会图例的参数
        x_center_min = float('inf')
        y_center_max = 0
        # 用于获取一个矩形的大小，让图例位置为一个图例大小
        sum_w = 0
        number = 0

        for item in data:
            coordinates_str = item['word_coordinates']
            word = item['word']
            x, y, w, h = map(int, coordinates_str.split(','))

            x_center_min = min(x_center_min, x + w / 2)
            y_center_max = max(y_center_max, y + h / 2)
            sum_w += w
            number += 1

            # 左上角 → 右上角 → 右下角 → 左下角 → 回到左上角（闭合）
            rect_x = [x, x + w, x + w, x, x]
            rect_y = [y, y, y + h, y + h, y]

            # 绘制边框矩形
            plt.plot(rect_x, rect_y, color=colors[idx], alpha=0.8, linewidth=2)

            # 绘制文字
            # word = word.replace("$", "\\$")
            # plt.text(x + w / 2, y + h / 2, word, usetex=False, fontsize=8, bbox=dict(
            #     facecolor='white', edgecolor=colors[idx]
            # ))

        # 绘制列名图例
        average_w = sum_w / number
        legend_name = f'行{idx + 1}'
        # plt.text(x_center_min - average_w, y_center_max, legend_name, fontsize=8,
        #          ha='center', va='center', bbox=dict(
        #         facecolor='white', edgecolor=colors[idx]
        #     ))

    # 设置图表样式
    plt.title('文字坐标可视化(按组区分)', fontsize=16, pad=20)
    plt.xlabel('X坐标（越大越靠右）', fontsize=12, labelpad=10)
    plt.ylabel('Y坐标（越大越靠上）', fontsize=12, labelpad=10)
    plt.grid(linestyle='--', alpha=0.3, color='gray')  # 浅灰色网格

    try:
        plt.tight_layout()
    except Exception as e:
        print(f"tight_layout 错误: {e}")

    if SAVE_IMAGE:
        return figure

    if display_image:
        # 显示图表
        plt.show()
        # 关闭画板
        plt.close()

    return figure


def modern_dbscan_overlap_data(sorted_data, display_image):
    # 获取画板
    figure = plt.figure(figsize=(12, 8))  # 增大画布尺寸，避免标注拥挤

    # 生成颜色（按子列表分组，每组一个颜色）
    num_groups = 0
    for cluster_data in sorted_data:
        num_groups += len(cluster_data)

    # 从tab20色板中取色
    colors = plt.cm.tab20(np.linspace(0, 1, num_groups))
    idx = 0
    for cluster_data in sorted_data:
        for data in cluster_data:
            # 用于绘图的参数
            for item in data:
                coordinates_str = item['word_coordinates']
                word = item['word']
                x, y, w, h = map(int, coordinates_str.split(','))

                # 左上角 → 右上角 → 右下角 → 左下角 → 回到左上角（闭合）
                rect_x = [x, x + w, x + w, x, x]
                rect_y = [y, y, y + h, y + h, y]

                # 绘制边框矩形
                plt.plot(rect_x, rect_y, color=colors[idx], alpha=0.8, linewidth=2)

                # 绘制文字
                word = word.replace("$", "\\$")
                print(word,end='')
                plt.text(x + w / 2, y + h / 2, word, usetex=False, fontsize=8, bbox=dict(
                    facecolor='white', edgecolor=colors[idx]
                ))
            idx += 1
            print()
        print()

    # 设置图表样式
    plt.title('文字坐标可视化(按组区分)', fontsize=16, pad=20)
    plt.xlabel('X坐标（越大越靠右）', fontsize=12, labelpad=10)
    plt.ylabel('Y坐标（越大越靠上）', fontsize=12, labelpad=10)
    plt.grid(linestyle='--', alpha=0.3, color='gray')  # 浅灰色网格

    try:
        plt.tight_layout()
    except Exception as e:
        print(f"tight_layout 错误: {e}")

    if SAVE_IMAGE:
        return figure

    if display_image:
        # 显示图表
        plt.show()
        # 关闭画板
        plt.close()

    return None

def ancient_plot_visualization_dbscan_data(sorted_data,display_image):
    pass
